//package com.ruoyi.websocker;
//
//import com.alibaba.fastjson2.JSON;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.socket.WebSocketSession;
//import org.springframework.web.socket.config.annotation.EnableWebSocket;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
//@Component
//@ServerEndpoint("/websocket/{id}/{identity}")
//@EnableWebSocket
//@Slf4j
//public class WebSocket {
//    //用本地线程保存session
//    private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
//    //保存所有连接上的用户的session
//    private static Map<String, SocketUserBean> userSessionMap = new ConcurrentHashMap<>();
//    //保存在线客服的session
//    private static Map<String, SocketUserBean> serverSessionMap = new ConcurrentHashMap<>();
//    //连接
//    @OnOpen
//    public void onOpen(Session session, @PathParam(value="identity") String role,@PathParam(value = "id") String id) {
//        //默认返回错误状态
//        Map<String, String> resultMap = new HashMap<>();
//        resultMap.put("state", "error");
//        //保证各个线程里的变量相对独立于其他线程内的变量
//        sessions.set(session);
//        //客服上线
//        if (role.equals("客服")) {
//            //创建一个在线客服信息
//            SocketUserBean serverInfo = new SocketUserBean();
//            serverInfo.setId(id);
//            serverInfo.setSession(session);
//            serverInfo.setUserRole("客服");
//            //告诉客服连接成功
//            resultMap.put("state", "success");
//            //去查询是否有排队中的用户
//            //如果存在排队的用户，就将用户和客服绑定
//            if (findLineUser() != null){
//                SocketUserBean userInfo = userSessionMap.get(findLineUser());
//                //将用户绑定到客服
//                serverInfo.setTargetid(userInfo.getId());
//                //将客服绑定到用户
//                userInfo.setTargetid(serverInfo.getId());
//                userSessionMap.put(userInfo.getId(), userInfo);
//                System.out.println("客户"+ serverInfo.getId() + "正在为用户" + userInfo.getId()+"服务");
//
//                Map<String, String> result = new HashMap<>();
//                //客服显示用户信息
//                result.put("msg", "正在为用户"+userInfo.getId()+"服务！");
//                sendMsg(serverInfo.getSession(), JSON.toJSONString(result));
//                //告诉用户有客服为他服务
//                result.put("msg", "客服"+serverInfo.getId()+"正在为您服务！");
//                sendMsg(userInfo.getSession(), JSON.toJSONString(result));
//            }else {
//                resultMap.put("msg", "当前没用户在线，请等待用户进行连接");
//            }
//            System.out.println("id"+id);
//            //将在线客服信息保存到map中
//            serverSessionMap.put(id, serverInfo);
//            System.out.println("客服：" + serverInfo.getId() + "连接上服务器，当前在线客服共计：" + serverSessionMap.size());
//        }
//        if (role.equals("用户")) {
//
//            //创建一个在线用户信息
//            SocketUserBean userInfo = new SocketUserBean();
//            userInfo.setId(id);
//            userInfo.setSession(session);
//            userInfo.setUserRole("用户");
//
//            //告诉用户连接成功
//            resultMap.put("state", "success");
//
//            //去查询是否有在线的客服
//            //有空闲客服就将用户和客服绑定
//            if (findFreeServer() != null){
//                SocketUserBean serverInfo = serverSessionMap.get(findFreeServer());
//                //将用户绑定到客服
//                serverInfo.setTargetid(userInfo.getId());
//                serverSessionMap.put(serverInfo.getId(), serverInfo);
//                //将客服绑定到用户
//                userInfo.setTargetid(serverInfo.getId());
//                System.out.println("客户"+ serverInfo.getId() + "正在为" + userInfo.getId()+"服务");
//
//                Map<String, String> result = new HashMap<>();
//                //客服显示用户信息
//                result.put("msg", "正在为用户"+userInfo.getId()+"服务！");
//                sendMsg(serverInfo.getSession(), JSON.toJSONString(result));
//                result.put("msg", "客服"+serverInfo.getId()+"正在为您服务！");
//                sendMsg(userInfo.getSession(), JSON.toJSONString(result));
//            } else {
//                //告诉用户系统繁忙
//                resultMap.put("msg", "系统繁忙！");
//            }
//
//            //将在线用户信息保存到map中
//            userSessionMap.put(id, userInfo);
//            System.out.println("用户编号：" + userInfo.getId() + "连接上服务器，当前在线用户共计：" + userSessionMap.size());
//        }
//        //返回连接信息
//        String result = JSON.toJSONString(resultMap);
//        System.out.println(result);
//        sendMsg(session, result);
//    }
//
//    //关闭连接
//    @OnClose
//    public void onClose(Session session,@PathParam(value = "id") String id) {
//        SocketUserBean serverInfo = serverSessionMap.get(id);
//        //客服下线
//        if (serverInfo != null) {
//            //将客户从map中移除
//            serverSessionMap.remove(id);
//
//            //查看是否有服务服务对象
//            if (null != serverInfo.getTargetid()){
//                //给用户说系统错误
//                Map<String, String> result = new HashMap<>();
//                result.put("msg", "系统错误，请刷新重试！");
//                sendMsg(userSessionMap.get(serverInfo.getTargetid()).getSession(), JSON.toJSONString(result));
//            }
//            System.out.println("客服编号：" + serverInfo.getId() + "退出了连接，当前在线客服共计：" + serverSessionMap.size());
//        } else {//用户下线
//            //将用户从map中移除
//            userSessionMap.remove(id);
//            //从客服中解绑
//            for (SocketUserBean serverSocketInfo: serverSessionMap.values()) {
//                //查找绑定的客服，即客服绑定的用户不为空，并且绑定的用户id和现在下线的用户id一样
//                if (serverSocketInfo.getTargetid() != null && serverSocketInfo.getTargetid().equals(session.getId())){
//                    //解绑
//                    serverSocketInfo.setTargetid(null);
//                    serverSessionMap.put(serverSocketInfo.getId(), serverSocketInfo);
//                    System.out.println("用户编号：" + session.getId() + "断开了与客服" + serverSocketInfo.getId() + "的连接");
//
//                    //客服解绑以后，可能还会有在线排队的用户，就让这个客服去
//                    String lineUser = findLineUser();
//                    if (lineUser != null){
//                        //将用户绑定到客服
//                        serverSocketInfo.setTargetid(lineUser);
//                        serverSessionMap.put(serverSocketInfo.getId(), serverSocketInfo);
//                        //将客服绑定到用户
//                        userSessionMap.get(lineUser).setTargetid(serverSocketInfo.getId());
//                        System.out.println("客户"+ serverSocketInfo.getId() + "正在为" + lineUser+"服务");
//
//                        Map<String, String> result = new HashMap<>();
//                        //客服显示用户信息
//                        result.put("msg", "正在为用户"+lineUser+"服务！");
//                        sendMsg(serverSocketInfo.getSession(), JSON.toJSONString(result));
//                        //用户显示客户信息
//                        result.put("msg", "客服"+serverSocketInfo.getId()+"正在为您服务！");
//                        sendMsg(userSessionMap.get(lineUser).getSession(), JSON.toJSONString(result));
//                    }
//                }
//            }
//            System.out.println("用户编号：" + session.getId() + "退出了连接，当前在线用户共计：" + userSessionMap.size());
//        }
//    }
//
//    //用户和客户端互相传递消息
//    @OnMessage
//    public void onMessage(String message, Session session,@PathParam(value = "id") String id) {
//        //消息
//        Map<String, String> result = new HashMap<>();
//        SocketUserBean serverInfo = serverSessionMap.get(id);
//        //客服消息
//        if (serverInfo != null) {
//            System.out.println("客服"+ id+"发送消息：\""+ message +"\"给用户"+serverSessionMap.get(id).getTargetid());
//            result.put("msg", "客服"+id+"："+message);
//            //将消息发送给用户
//            //要判断是否绑定到有用户如果有就将消息传递到用户
//            if (null != serverSessionMap.get(id).getTargetid()){
//                sendMsg(userSessionMap.get(serverSessionMap.get(id).getTargetid()).getSession(), JSON.toJSONString(result));
//            } else {//如果没有就将消息给自己，嘻嘻嘻
//                result.put("msg", "当前没用户在线，请等待用户进行连接");
//                sendMsg(serverInfo.getSession(), JSON.toJSONString(result));
//            }
//
//        } else {//用户消息
//            System.out.println("用户"+ id+"发送消息：\""+ message +"\"给客户"+userSessionMap.get(id).getTargetid());
//            result.put("msg", "用户"+id+"："+message);
//            //将消息发送给客服
//            //判断是否绑定了客服，如果有就发送消息
//            if (null != userSessionMap.get(id).getTargetid()){
//                sendMsg(serverSessionMap.get(userSessionMap.get(id).getTargetid()).getSession(), JSON.toJSONString(result));
//            } else{//同上
//                result.put("msg", "当前没客服在线，请等待用户进行连接");
//                sendMsg(userSessionMap.get(id).getSession(), JSON.toJSONString(result));
//            }
//        }
//    }
//
//    //异常
//    @OnError
//    public void onError(Session session, Throwable throwable) {
//        System.out.println("发生异常!");
//        throwable.printStackTrace();
//    }
//
//
//
//    //统一的发送消息方法
//    private synchronized void sendMsg(Session session, String msg) {
//
//        try {
//            session.getBasicRemote().sendText(msg);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//
//    }
//
//    //查询排队用户
//    private synchronized String findLineUser(){
//        //判断是否有用户
//        if (userSessionMap.size() > 0){
//            //遍历所有用户，查找一个排队的用户
//            for (SocketUserBean UserInfo: userSessionMap.values()) {
//                if (null == UserInfo.getTargetid()){
//                        return UserInfo.getId();
//                }
//            }
//        }
//        return null;
//    }
//
//    //查询在线空闲客服
//    private  synchronized String findFreeServer(){
//        //判断是否有客服
//        if (serverSessionMap.size() > 0){
//            //遍历所有客服，查找一个空闲的客服
//            for (SocketUserBean serverInfo: serverSessionMap.values()) {
//                if (null == serverInfo.getTargetid()){
//                    return serverInfo.getId();
//                }
//            }
//        }
//        return null;
//    }
//
//
//
//
//
//}
